#include <iostream>
#include<signal.h>
#include "../comm/httplib.h"
#include"oj_control.hpp"

using namespace httplib;
using namespace ns_control;

static Control* ctrl_ptr = nullptr;

//当设备被全部挂掉，又被运维重启过后，需要将主机从离线主机列表调回在线主机列表
void Recovery(int sig)
{
   ctrl_ptr->RecoveryMachine();
}

int main()
{
   signal(SIGQUIT, Recovery);
   // 1.用户请求服务的路由功能(进入指定页面)
   Server svr;
   Control ctrl;//内部包含了题库信息
   ctrl_ptr = &ctrl;

   // 获取所有的题目的界面(若有人访问此界面，便做指定应答)
   svr.Get("/all_questions", [&ctrl](const Request &req, Response &resp)
           {
              //需要提供张 所有题目的网络界面
               std::string html;
               ctrl.AllQuestions(&html);
               resp.set_content(html, "text/html; charset=utf-8"); // 响应
           });

   // 获取指定编号题目的页面
   svr.Get(R"(/question/(\d+))", [&ctrl](const Request &req, Response &resp)
           {
        std::string number = req.matches[1];//获取题目编号
        std::string html;
        ctrl.Question(number, &html);//根据题号获取指定题目页面

        resp.set_content(html, "text/html; charset=utf-8"); });

   // 提交代码、判题功能（1.测试用例 2.compile_and_run网络服务)
   // 对指定的题目进行判题
   svr.Post(R"(/judge/(\d+))", [&ctrl](const Request &req, Response &resp)
           {
        std::string number = req.matches[1];//获取题目编号
        std::string result_json;
        ctrl.Judge(number, req.body, &result_json);
        resp.set_content(result_json,"application/json;charset=utf-8");});

   svr.set_base_dir("./wwwroot"); // 设定默认访问界面
   svr.listen("0.0.0.0", 8080);   // 监听
   return 0;
}